/*!
 * Template module v1.0.0 of jRaiser javascript library
 * http://code.google.com/p/jraiser/
 *
 * Author: Heero.Luo
 * Licensed under MIT license
 *
 * Date: Wed May 30 2012 17:12:06 GMT+0800
 */
define(function(require, exports, module) { 'use strict';

// 模板缓存
var tplCache = { };

/**
 * 模板转换
 * @param {String} 模板
 * @param {Object} 数据字典
 * @param {Boolean} 是否缓存模板，默认为是
 * @return {String} 转换结果
 */
exports.parse = function(tpl, data, isCached) {
	if (null == tpl) { return null; }
	if (null == data) { return tpl; }

	if ('_' in data) {throw new Error('invalid key("_") of data'); }

	var fn = tplCache[tpl];
	if (!fn) {
		fn = new Function("obj", "var _=[];with(obj){_.push('" +
				tpl.replace(/[\r\t\n]/g, " ")
				.replace(/'(?=[^#]*#>)/g, "\t")
				.split("'").join("\\'")
				.split("\t").join("'")
				.replace(/<#=(.+?)#>/g, "',$1,'")
				.split("<#").join("');")
				.split("#>").join("_.push('")
				+ "');}return _.join('');");
		
		// 缓存模版，提高性能
		if (isCached !== false) { tplCache[tpl] = fn; }
	}
	
	return fn(data);
};

/**
 * 从指定节点的子节点读取模版
 * @param {DOMElement} 节点（节点的title属性值将作为模版字典的键）
 * @return {Object} 模版字典
 */
exports.load = function(elt) {
	var child = elt.firstChild, tpls = { };
	while (child) {
		if (child.nodeType === 1) {
			tpls[child.title] = child.innerHTML.replace(/^<!--/, '').replace(/-->$/, '');
		}
		child = child.nextSibling;
	}
	
	return tpls;
};

});